home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
pao
/
towns
/
paolib
/
cdp
/
cdptest.c
< prev
next >
Wrap
Text File
|
1991-10-18
|
42KB
|
1,108 lines
/* << High C V1.4 >> **********************************************************
**
** CD簡易演奏ライブラリの試験プログラム
**
** 1991.02.09 : CREATE
** 1991.02.15 : FINISH
**
** < HISTORY >
** 1991.02.09 : CREATE
** 1991.02.19 : SHUFFLE機能の追加.
** 1991.05.30 : 清書
**
** < note > : TABS = 4
**
** このプログラムは,コンソール上で動作させて下さい.
**
** Programmed by Y.Hirata ( Nifty ID : NAB03321 )
**
******************************************************************************/
/*-----------------------------------------------------------------------------
** CDP.LIB 使用上の注意事項
**
** 1.
** ヘッダファイル CDP.H をインクルードして下さい. CDR.H はインクルードする必要ありません.
**
** 2.
** 使用する関数は、CDP_****() だけにして下さい.
** PAUSE中とかに、別関数を使用して PAUSE/STOP した場合に、続きの処理が保証
** されません.
**
** 3.
** LINK時には、CDP.LIB の他に CDR.LIB もLINKして下さい.
** また、LINKオプション -CALLBUFS に 2 以上の値を指定して下さい.
** TWOCASE でLINKして下さい.
-----------------------------------------------------------------------------*/
#include <stdio.h>
#include "cdp.h"
#include <mos.h>
#include <snd.h>
#define MworkSize 4096 /* マウス作業域のサイズ */
char Mwork[MworkSize] ; /* マウス作業域 */
#define MOS_LEFT 1 /* マウス左クリック */
#define MOS_RIGHT 2 /* マウス右クリック */
#define MOS_BOTH 3 /* マウス左右クリック */
#define LOCATE(x,y) printf("\x1b[%d;%dH",y,x)
#define CLS() printf("\x1b[2J")
#define CR() printf("\n");
#define CURON() printf("\x1b[0v");
#define CUROFF() printf("\x1b[1v");
#define CDC_WAIT 5000 /* 適当な値 */
/******************************* マウス制御を待つ *****************************/
void mosloop( int sw,int *mbot,int *mx,int *my )
{
do {
MOS_rdpos( mbot,mx,my ) ;
} while ( *mbot == sw ) ;
}
/******************************* TOC 情報表示 *****************************/
void tocdisp()
{
char minw ;
int c ;
/*-----------------------------------------------------------------------------
** TOC 情報は、CDP_INFO_buf. に格納されています.
**
** 他の時間情報は、それぞれ・・・
** CDP_INFO_buf.discend : 全時間
** CDP_INFO_buf.track[0] : TOC 時間(TOC情報格納部分)
** CDP_TIME_music : 全演奏時間
** CDP_TIME_data : 全データ時間
** 注意 : 全時間は、TOC時間 + 全データ時間 + 全演奏時間 + 1フレーム となります.
** CDP_TIME_track[] : 各トラックの演奏(データ)時間
** となっています.
**
** トラック内がデータなのか音楽なのかは、次の方法で確認できます.
** (1) CDP_INFO_buf.track[] に格納されている時間の再上位ビットがON/OFFで確認.
** ON ならば データ , OFFならば 音楽 です.
** (2) CDP_data_check(曲番号 1~99) をCALLし、そのリターン値で確認.
** リターン値が 真 ならば データ , 偽 ならば 音楽 です.
-----------------------------------------------------------------------------*/
printf( "\n\n" ) ;
minw = CDP_INFO_buf.track[0].min ;
if ( ( minw & 0x80 ) == 0x80 ) minw &= 0x7f ;
printf( "開始曲番号 : %d , 終了曲番号 : %d\n",CDP_INFO_buf.start,CDP_INFO_buf.end ) ;
printf( "曲数 : %d, 総時間 : %02d-%02d-%02d , TOC 時間 : %02d-%02d-%02d\n",CDP_INFO_buf.end,CDP_INFO_buf.discend.min,CDP_INFO_buf.discend.sec,CDP_INFO_buf.discend.frame,minw,CDP_INFO_buf.track[0].sec,CDP_INFO_buf.track[0].frame ) ;
printf( "総演奏時間 : %02d-%02d-%02d , 総データ時間 : %02d-%02d-%02d\n",
CDP_TIME_music.min,CDP_TIME_music.sec,CDP_TIME_music.frame,
CDP_TIME_data.min,CDP_TIME_data.sec,CDP_TIME_data.frame ) ;
for ( c=0; c<CDP_INFO_buf.end; c++ ) {
printf( "%02d : %02d-%02d-%02d ; ",c+1,CDP_TIME_track[c].min,
CDP_TIME_track[c].sec,CDP_TIME_track[c].frame ) ;
if ( CDP_data_check( c+1 ) ) printf( "データ\n" ) ;
else printf( "音楽\n" ) ;
}
}
/******************************** 演奏時間表示 *****************************/
void timedisp()
{
/*-----------------------------------------------------------------------------
** 演奏時間の情報は、CDP_status() をCALLすることによって取得できます.
**
** 演奏情報は、それぞれ・・・
** CDP_NOW_status : 現在の演奏状態
**
** CDP_NOW_musicno : 演奏中の曲番号
** CDP_CLOCK_nowtrack : 演奏中の曲内経過時間
** CDP_CLOCK_nowdisc : 演奏中のトータル経過時間
** CDP_TIME_nowtrack : 演奏中の曲内残り時間
** CDP_TIME_nowdisc : 演奏中のトータル残り時間
** となっています.
-----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
** 1曲演奏時に、演奏終了する前に次の曲の頭を少し演奏してしまうことがあるの
** で、表示する際には、チェックをする必要がある.
-----------------------------------------------------------------------------*/
if ( CDP_NOW_start == CDP_NOW_end ) /* 一曲演奏時 */
if ( CDP_NOW_start != CDP_NOW_musicno ) return ;
LOCATE( 1,25 ) ;
printf( "<%02d/%02d> %02d-%02d-%02d [-%02d-%02d-%02d] : %02d-%02d-%02d [-%02d-%02d-%02d]",CDP_NOW_musicno,CDP_INFO_buf.end,CDP_CLOCK_nowtrack.min,CDP_CLOCK_nowtrack.sec,CDP_CLOCK_nowtrack.frame,CDP_TIME_nowtrack.min,CDP_TIME_nowtrack.sec,CDP_TIME_nowtrack.frame,CDP_CLOCK_nowdisc.min,CDP_CLOCK_nowdisc.sec,CDP_CLOCK_nowdisc.frame,CDP_TIME_nowdisc.min,CDP_TIME_nowdisc.sec,CDP_TIME_nowdisc.frame ) ;
}
/****************************** 一時停止時間表示 ***************************/
void pausedisp()
{
/*-----------------------------------------------------------------------------
** PAUSE時間の情報は、演奏状態に CDP_pause() をCALLした時点で登録されます.
** また、CDP_fftime() か CDP_rewtime()をCALLした時点で変更されます.
**
** 演奏情報は、それぞれ・・・
** CDP_NOW_pause : PAUSE時の曲番号
** CDP_CLOCK_pause : PAUSE時の曲内経過時間
** CDP_CLOCK_pausedisc : PAUSE時のトータル経過時間
** となっています.
-----------------------------------------------------------------------------*/
printf( "PAUSE TIME : <%02d> %02d-%02d-%02d [%02d-%02d-%02d]\n",CDP_NOW_pause,CDP_CLOCK_pause.min,CDP_CLOCK_pause.sec,CDP_CLOCK_pause.frame,CDP_CLOCK_pausedisc.min,CDP_CLOCK_pausedisc.sec,CDP_CLOCK_pausedisc.frame ) ;
}
/******************************** 前後演奏試験 *****************************/
void test1()
{
int mbot, mx, my ; /* マウス状態格納変数 */
int dbot, dx, dy ; /* マウス状態格納変数 */
int c ;
int ret ;
printf( "\nNEXT / BEFORE PLAY TEST\n" ) ;
printf( "左クリックで前の曲 , 右クリックで次の曲 , 左右同時クリックで終了\n" ) ;
/*-----------------------------------------------------------------------------
** 演奏を開始する時に、演奏開始曲/終了曲等の各パラメタを設定する必要がある場合に
** は、必ず前もって CDP_status() か CDP_tocread() をCALLしておく必要があり
** ます.
** ただし、最初だけであり、一度でも CDP_*****() をCALLしていれば、必要ありま
** せん.
**
** 演奏開始曲番号は、CDP_NOW_start にセットします.(省略値は、最初の曲)
** 演奏終了曲番号は、CDP_NOW_end にセットします.(省略値は、最後の曲)
** 繰り返し演奏回数は、CDP_REP_cnt にセットします.(省略値は、1回)
** ただし、これらのパラメタに誤りがあると、CDP_****() は、パラメタエラーを返します.
**
** 注意 : CDが入れ換えられると新たにTOCが読み直され、演奏開始~終了位置(曲番
** 号および時間)が初期値(省略値)に設定されます.
-----------------------------------------------------------------------------*/
CUROFF() ;
c = 0 ;
ret = CDP_status() ;
if ( CDP_NOW_status == CDP_STAT_PLAY ) { /* 演奏中 */
timedisp() ;
}
if ( ret == CDP_ERR_CHANGE ) { /* CDが入れ換えられた */
CDP_play() ;
tocdisp() ;
}
do {
MOS_rdpos( &mbot,&mx,&my ) ;
if ( mbot == MOS_LEFT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
/* マウス左クリック */
/*-----------------------------------------------------------------------------
** あらかじめ演奏状態を取得しておいて・・・・
**
** 現在演奏中の曲番号に対して、一つ後ろの曲を CDP_NOW_start にセットして
** CDP_play() をCALLし、演奏する.
-----------------------------------------------------------------------------*/
CDP_NOW_start = CDP_NOW_musicno + 1 ;
printf( "\n\nNEXT PLAY ... %d 曲目\n",
CDP_NOW_start ) ;
CDP_debug_dispmsg( CDP_play() ) ;
/*-----------------------------------------------------------------------------
** デバッグ用に CDP_status() をCALLしていますが、CDP_play() をCALLした直後
** であれば、CDP_status() をCALLしなくても、情報はグローバル変数にセットされてい
** ます.
-----------------------------------------------------------------------------*/
printf( "実際の演奏曲は、%d 曲目 ~ %d 曲目\n演奏後の状態 ... ",CDP_NOW_start,CDP_NOW_end ) ;
CDP_debug_dispmsg( CDP_status() ) ;
mosloop( MOS_LEFT,&dbot,&dx,&dy ) ; /* 左クリック開放を待つ */
}
if ( mbot == MOS_RIGHT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
/* マウス右クリック */
/*-----------------------------------------------------------------------------
** あらかじめ演奏状態を取得しておいて・・・・
**
** 現在演奏中の曲番号に対して、一つ前の曲を CDP_NOW_start にセットして
** CDP_play() をCALLし、演奏する.
-----------------------------------------------------------------------------*/
CDP_NOW_start = CDP_NOW_musicno - 1 ;
printf( "\n\nBEFORE PLAY ... %d 曲目\n",
CDP_NOW_start ) ;
CDP_debug_dispmsg( CDP_play() ) ;
/*-----------------------------------------------------------------------------
** デバッグ用に CDP_status() をCALLしていますが、CDP_play() をCALLした直後
** であれば、CDP_status() をCALLしなくても、情報はグローバル変数にセットされてい
** ます.
-----------------------------------------------------------------------------*/
printf( "実際の演奏曲は、%d 曲目 ~ %d 曲目\n演奏後の状態 ... ",CDP_NOW_start,CDP_NOW_end ) ;
CDP_debug_dispmsg( CDP_status() ) ;
mosloop( MOS_RIGHT,&dbot,&dx,&dy ) ; /* 右クリック開放を待つ */
}
/*-----------------------------------------------------------------------------
** 演奏中にCDの情報を取得する時には、以前取得した時よりも 200ms 以上の wait
** をおいてからにして下さい. そうしないと、音飛びなどの現象を起こします.
-----------------------------------------------------------------------------*/
if ( c < CDC_WAIT ) { /* wait */
c++ ;
} else {
c = 0 ;
/*-----------------------------------------------------------------------------
** 演奏中ならば演奏時間の情報を表示し、CDが入れ換えられたならば、最初から演奏
** し直します.
-----------------------------------------------------------------------------*/
ret = CDP_status() ;
if ( CDP_NOW_status == CDP_STAT_PLAY ) {
timedisp() ;
}
if ( ret == CDP_ERR_CHANGE ) {
CDP_play() ;
tocdisp() ;
}
}
} while ( mbot != MOS_BOTH ) ; /* 左右同時クリックで終了 */
CURON() ;
}
/******************************** 一時停止試験 *****************************/
void test2()
{
int mbot, mx, my ; /* マウス状態格納変数 */
int dbot, dx, dy ; /* マウス状態格納変数 */
int c ;
int ret ;
printf( "\nPAUSE ON/OFF PLAY TEST\n" ) ;
printf( "左クリックでPAUSE ON/OFF , 右クリックで頭出し演奏 , 左右同時クリックで終了\n" ) ;
/*-----------------------------------------------------------------------------
** PAUSE処理は、CDP_pause() をCALLすることによって、PAUSE ON/OFF をします.
** 注意 : 本ライブラリ以外の関数を使用して CD演奏をSTOP/PAUSE した後の処理につい
** ては、動作が保証されません.
-----------------------------------------------------------------------------*/
CUROFF() ;
c = 0 ;
do {
MOS_rdpos( &mbot,&mx,&my ) ;
/*-----------------------------------------------------------------------------
** PAUSE時に、CDP_pause() をCALLすることによって、PAUSE解除となりますが、
** この時に、CDP_FLG_pauseplay によって動作が異なります.
**
** CDP_FLG_pauseplay が 真 ならば、
** CDP_NOW_start, CDP_NOW_end, CDP_CLOCK_start, CDP_CLOCK_end の値に
** 従って演奏処理されます.
** (CDP_CLOCK_start,CDP_CLOCK_endは、アプリケーション側で値を変更しないで下さい.
** CDP_play(), CDP_fftime(), CDP_rewtime() で設定される変数です.)
**
** CDP_FLG_pauseplay が 偽 ならば、
** PAUSE時点から、演奏が再開(CONTINUE)されます.
**
** 注意 : 本ライブラリ以外の関数を使用して CD演奏をSTOP/PAUSE した後の処理につい
** ては、動作が保証されません.
**
** また、CDP_FLG_pauseplay が 真 の値になっていないと、PAUSE中に演奏
** 処理(CDP_play())を行うことができません.
-----------------------------------------------------------------------------*/
if ( mbot == MOS_LEFT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
/* 左クリック */
CDP_pause() ;
if ( CDP_NOW_status != CDP_STAT_PAUSE ) {
printf( "\nPAUSE 解除 !\n" ) ;
} else {
printf( "\nPAUSE ...\n" ) ;
pausedisp() ;
}
mosloop( MOS_LEFT,&dbot,&dx,&dy ) ; /* 左クリック開放を待つ */
}
if ( mbot == MOS_RIGHT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
/* 右クリック */
/*-----------------------------------------------------------------------------
** 頭出し演奏をします.
**
** PAUSE中ならば、
** CDP_FLG_pauseplay を 真 にし、CDP_NOW_start に演奏開始曲番号をセットします.
**
** 演奏中ならば、
** CDP_NOW_start に演奏中の曲番号をセットします.
**
** 停止中ならば、
** 最初の曲番号をセットします.
-----------------------------------------------------------------------------*/
switch ( CDP_NOW_status ) {
case CDP_STAT_PAUSE :
CDP_FLG_pauseplay = CDP_TRUE ;
CDP_NOW_start = CDP_NOW_pause ;
break ;
case CDP_STAT_PLAY :
CDP_NOW_start = CDP_NOW_musicno ;
break ;
case CDP_STAT_STOP :
CDP_NOW_start = CDP_INFO_buf.start ;
break ;
}
CDP_play() ;
mosloop( MOS_RIGHT,&dbot,&dx,&dy ) ; /* 右クリック開放を待つ */
}
/*-----------------------------------------------------------------------------
** 演奏中にCDの情報を取得する時には、以前取得した時よりも 200ms 以上の wait
** をおいてからにして下さい. そうしないと、音飛びなどの現象を起こします.
-----------------------------------------------------------------------------*/
if ( c < CDC_WAIT ) { /* wait */
c++ ;
} else {
c = 0 ;
/*-----------------------------------------------------------------------------
** 演奏中ならば演奏時間の情報を表示し、CDが入れ換えられたならば、最初から演奏
** し直します.
-----------------------------------------------------------------------------*/
ret = CDP_status() ;
if ( CDP_NOW_status == CDP_STAT_PLAY ) {
timedisp() ;
}
if ( ret == CDP_ERR_CHANGE ) {
CDP_play() ;
tocdisp() ;
}
}
} while ( mbot != MOS_BOTH ) ; /* 左右同時クリックで終了 */
CURON() ;
}
/*************************** 先送り後戻り演奏試験 **************************/
void test3()
{
int mbot, mx, my ; /* マウス状態格納変数 */
int dbot, dx, dy ; /* マウス状態格納変数 */
int c ;
int ret ;
printf( "\nFF / REW PLAY TEST\n" ) ;
printf( "左クリックで先送り , 右クリックで後戻り , 左右同時クリックで終了\n" ) ;
/*-----------------------------------------------------------------------------
** 先送り/後戻り演奏をする前には、必ず CDP_pause() をCALLして下さい.
** PAUSE状態でないと、動作しません.
** 先送り/後戻りの時間設定が終わったら、再度 CDP_pause() をCALLして、PAUSE
** 状態を解除して下さい.
**
** 注意 : CDP_pause() をCALLして、PAUSE状態を解除する時に、CDP_FLG_pauseplay
** の値が 偽 であると、PAUSE時点から演奏を再開(CONTINUE)します.
** CDP_fftime(), CDP_rewtime() をCALLすると、
** CDP_FLG_pauseplay の値は、真 となります.
** 故意に、PAUSE時点から演奏再開をしたい場合にだけ、CDP_FLG_pauseplay
** の値を操作(偽にする)して下さい.
-----------------------------------------------------------------------------*/
CUROFF() ;
c = 0 ;
do {
MOS_rdpos( &mbot,&mx,&my ) ;
if ( mbot == MOS_LEFT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
/* 左クリック */
/*-----------------------------------------------------------------------------
** CDP_fftime() では、CDP_FFREW_SEC の時間[秒]分だけ、時間が進みます.
** 演奏可能時間を過ぎたら、パラメタエラーの値が返ってきます.
-----------------------------------------------------------------------------*/
CDP_pause() ;
do {
if ( CDP_NOW_status != CDP_STAT_PAUSE ) break ;
ret = CDP_fftime() ;
if ( ret ) {
mosloop( MOS_LEFT,&dbot,&dx,&dy ) ;
break ;
} else {
timedisp() ;
}
MOS_rdpos( &dbot,&dx,&dy ) ;
} while ( dbot == MOS_LEFT ) ;
CDP_pause() ;
}
if ( mbot == MOS_RIGHT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
/* 右クリック */
/*-----------------------------------------------------------------------------
** CDP_rewtime() では、CDP_FFREW_SEC の時間[秒]分だけ、時間が戻ります.
** 一番頭の時間まで戻ったら、パラメタエラーの値が返ってきます.
-----------------------------------------------------------------------------*/
CDP_pause() ;
do {
ret = CDP_rewtime() ;
if ( ret ) {
mosloop( MOS_RIGHT,&dbot,&dx,&dy ) ;
break ;
} else {
timedisp() ;
}
MOS_rdpos( &dbot,&dx,&dy ) ;
} while ( dbot == MOS_RIGHT ) ;
CDP_pause() ;
}
/*-----------------------------------------------------------------------------
** 演奏中にCDの情報を取得する時には、以前取得した時よりも 200ms 以上の wait
** をおいてからにして下さい. そうしないと、音飛びなどの現象を起こします.
-----------------------------------------------------------------------------*/
if ( c < CDC_WAIT ) { /* wait */
c++ ;
} else {
c = 0 ;
/*-----------------------------------------------------------------------------
** 演奏中ならば演奏時間の情報を表示し、CDが入れ換えられたならば、最初から演奏
** し直します.
-----------------------------------------------------------------------------*/
ret = CDP_status() ;
if ( CDP_NOW_status == CDP_STAT_PLAY ) {
timedisp() ;
}
if ( ret == CDP_ERR_CHANGE ) {
CDP_play() ;
tocdisp() ;
} else if ( CDP_NOW_status == CDP_STAT_STOP ) {
printf( "\n演奏終了しました.\n" ) ;
break ;
}
}
} while ( mbot != MOS_BOTH ) ; /* 左右同時クリックで終了 */
CURON() ;
}
/*************************** 先送り後戻り演奏試験 **************************/
void test4()
{
int mbot, mx, my ; /* マウス状態格納変数 */
int dbot, dx, dy ; /* マウス状態格納変数 */
int pbot, px, py ; /* マウス状態格納変数 */
int c ;
int ret ;
printf( "\nPAUSE & FF / REW PLAY TEST\n" ) ;
printf( "左クリックでPAUSE ON/OFF , 右クリックでPAUSEキャンセル , 左右同時クリックで終了\n" ) ;
printf( "PAUSE中に 左クリックで FF , 右クリックで REW , 左右同時クリックで EXIT\n" ) ;
/*-----------------------------------------------------------------------------
** 先送り/後戻り演奏をする前には、必ず CDP_pause() をCALLして下さい.
** PAUSE状態でないと、動作しません.
** 先送り/後戻りの時間設定が終わったら、再度 CDP_pause() をCALLして、PAUSE
** 状態を解除して下さい.
**
** 注意 : CDP_pause() をCALLして、PAUSE状態を解除する時に、CDP_FLG_pauseplay
** の値が 偽 であると、PAUSE時点から演奏を再開(CONTINUE)します.
** CDP_fftime(), CDP_rewtime() をCALLすると、
** CDP_FLG_pauseplay の値は、真 となります.
** 故意に、PAUSE時点から演奏再開をしたい場合にだけ、CDP_FLG_pauseplay
** の値を操作(偽にする)して下さい.
-----------------------------------------------------------------------------*/
CUROFF() ;
c = 0 ;
do {
MOS_rdpos( &mbot,&mx,&my ) ;
if ( mbot == MOS_LEFT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
/* 左クリック */
CDP_pause() ;
printf( "\nNOW PAUSE!\n" ) ;
pausedisp() ;
printf( "\n左クリックで FF , 右クリックで REW , 左右同時クリックで EXIT\n" ) ;
timedisp() ;
do {
MOS_rdpos( &pbot,&px,&py ) ;
if ( pbot == MOS_LEFT ) {
/*-----------------------------------------------------------------------------
** CDP_fftime() では、CDP_FFREW_SEC の時間[秒]分だけ、時間が進みます.
** 演奏可能時間を過ぎたら、パラメタエラーの値が返ってきます.
-----------------------------------------------------------------------------*/
do {
ret = CDP_fftime() ;
if ( ret ) {
mosloop( MOS_LEFT,&dbot,&dx,&dy ) ;
break ;
} else {
timedisp() ;
}
MOS_rdpos( &dbot,&dx,&dy ) ;
} while ( dbot == MOS_LEFT ) ;
} else if ( pbot == MOS_RIGHT ) {
/*-----------------------------------------------------------------------------
** CDP_rewtime() では、CDP_FFREW_SEC の時間[秒]分だけ、時間が戻ります.
** 一番頭の時間まで戻ったら、パラメタエラーの値が返ってきます.
-----------------------------------------------------------------------------*/
do {
ret = CDP_rewtime() ;
if ( ret ) {
mosloop( MOS_RIGHT,&dbot,&dx,&dy ) ;
break ;
} else {
timedisp() ;
}
MOS_rdpos( &dbot,&dx,&dy ) ;
} while ( dbot == MOS_RIGHT ) ;
}
} while ( pbot != MOS_BOTH ) ;
printf( "\n左クリックでPAUSE OFF , 右クリックでPAUSEキャンセル\n" ) ;
/*-----------------------------------------------------------------------------
** CDP_pause() をCALLして、PAUSE状態を解除する時に、CDP_FLG_pauseplay
** の値が 偽 であると、PAUSE時点から演奏が再開(CONTINUE)されます.
** CDP_fftime(), CDP_rewtime() をCALLすると、CDP_FLG_pauseplay の
** 値は、真 となります.
** 故意に、PAUSE時点から演奏再開をしたい場合にだけ、CDP_FLG_pauseplay の値を
** 操作(偽にする)します.
-----------------------------------------------------------------------------*/
for ( ;; ) {
mosloop( CDP_FALSE,&dbot,&dx,&dy ) ;
if ( dbot == MOS_LEFT ) {
printf( "指定された時間から演奏を開始します.\n" ) ;
break ;
} else if ( dbot == MOS_RIGHT ) {
CDP_FLG_pauseplay = CDP_FALSE ;
printf( "PAUSEされた時点からの演奏を開始します.\n" ) ;
break ;
}
}
mosloop( dbot,&dbot,&dx,&dy ) ;
CDP_pause() ;
}
/*-----------------------------------------------------------------------------
** 演奏中にCDの情報を取得する時には、以前取得した時よりも 200ms 以上の wait
** をおいてからにして下さい. そうしないと、音飛びなどの現象を起こします.
-----------------------------------------------------------------------------*/
if ( c < CDC_WAIT ) { /* wait */
c++ ;
} else {
c = 0 ;
/*-----------------------------------------------------------------------------
** 演奏中ならば演奏時間の情報を表示し、CDが入れ換えられたならば、最初から演奏
** し直します.
-----------------------------------------------------------------------------*/
ret = CDP_status() ;
if ( CDP_NOW_status == CDP_STAT_PLAY ) {
timedisp() ;
}
if ( ret == CDP_ERR_CHANGE ) {
CDP_play() ;
tocdisp() ;
} else if ( CDP_NOW_status == CDP_STAT_STOP ) {
printf( "\n演奏終了しました.\n" ) ;
break ;
}
}
} while ( mbot != MOS_BOTH ) ; /* 左右同時クリックで終了 */
CURON() ;
}
/************************ PAUSE中の次曲/前曲演奏試験 ***********************/
void test5()
{
int mbot, mx, my ; /* マウス状態格納変数 */
int dbot, dx, dy ; /* マウス状態格納変数 */
int pbot, px, py ; /* マウス状態格納変数 */
int c ;
int ret ;
printf( "\nPAUSE & NEXT / BEFORE PLAY TEST\n" ) ;
printf( "左クリックでPAUSE ON/OFF , 右クリックでPAUSEキャンセル , 左右同時クリックで終了\n" ) ;
printf( "PAUSE中に 左クリックで NEXT , 右クリックで BEFORE , 左右同時クリックで EXIT\n" ) ;
/*-----------------------------------------------------------------------------
** 曲単位での先送り/後戻り演奏をする前には、必ず CDP_pause() をCALLして下さ
** い.
** PAUSE状態でないと、動作しません.
** 曲単位での先送り/後戻りの時間設定が終わったら、再度 CDP_pause() をCALLし
** て、PAUSE状態を解除して下さい.
**
** 注意 : CDP_pause() をCALLして、PAUSE状態を解除する時に、CDP_FLG_pauseplay
** の値が 偽 であると、PAUSE時点から演奏を再開(CONTINUE)します.
** CDP_ffmusic(), CDP_rewmusic() をCALLすると、
** CDP_FLG_pauseplay の値は、真 となります.
** 故意に、PAUSE時点から演奏再開をしたい場合にだけ、CDP_FLG_pauseplay
** の値を操作(偽にする)して下さい.
-----------------------------------------------------------------------------*/
CUROFF() ;
c = 0 ;
do {
MOS_rdpos( &mbot,&mx,&my ) ;
if ( mbot == MOS_LEFT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
/* 左クリック */
CDP_pause() ;
printf( "\nNOW PAUSE!\n" ) ;
pausedisp() ;
printf( "\n左クリックで NEXT , 右クリックで BEFORE , 左右同時クリックで EXIT\n" ) ;
timedisp() ;
do {
MOS_rdpos( &pbot,&px,&py ) ;
if ( pbot == MOS_LEFT ) {
/*-----------------------------------------------------------------------------
** CDP_ffmusic() では、次の曲の頭出しをするための設定がされます.
** 最終曲を過ぎたら、パラメタエラーの値が返ってきます.
-----------------------------------------------------------------------------*/
do {
ret = CDP_ffmusic() ;
if ( ret ) {
mosloop( MOS_LEFT,&dbot,&dx,&dy ) ;
break ;
} else {
timedisp() ;
}
MOS_rdpos( &dbot,&dx,&dy ) ;
} while ( dbot == MOS_LEFT ) ;
} else if ( pbot == MOS_RIGHT ) {
/*-----------------------------------------------------------------------------
** CDP_rewmusic() では、前の曲の頭出しをするための設定がされます.
** ただし、現在の演奏時間が曲の先頭時間でなければ、現在の曲の頭出しとなります.
** 既に先頭が設定されている時には、パラメタエラーの値が返ってきます.
-----------------------------------------------------------------------------*/
do {
ret = CDP_rewmusic() ;
if ( ret ) {
mosloop( MOS_RIGHT,&dbot,&dx,&dy ) ;
break ;
} else {
timedisp() ;
}
MOS_rdpos( &dbot,&dx,&dy ) ;
} while ( dbot == MOS_RIGHT ) ;
}
} while ( pbot != MOS_BOTH ) ;
printf( "\n左クリックでPAUSE OFF , 右クリックでPAUSEキャンセル\n" ) ;
/*-----------------------------------------------------------------------------
** CDP_pause() をCALLして、PAUSE状態を解除する時に、CDP_FLG_pauseplay
** の値が 偽 であると、PAUSE時点から演奏が再開(CONTINUE)されます.
** CDP_ffmusic(), CDP_rewmusic() をCALLすると、CDP_FLG_pauseplayの
** 値は、真 となります.
** 故意に、PAUSE時点から演奏再開をしたい場合にだけ、CDP_FLG_pauseplay の値を
** 操作(偽にする)します.
-----------------------------------------------------------------------------*/
for ( ;; ) {
mosloop( CDP_FALSE,&dbot,&dx,&dy ) ;
if ( dbot == MOS_LEFT ) {
printf( "指定された曲の頭から演奏を開始します.\n" ) ;
break ;
} else if ( dbot == MOS_RIGHT ) {
CDP_FLG_pauseplay = CDP_FALSE ;
printf( "PAUSEされた時点からの演奏を開始します.\n" ) ;
break ;
}
}
mosloop( dbot,&dbot,&dx,&dy ) ;
CDP_pause() ;
}
/*-----------------------------------------------------------------------------
** 演奏中にCDの情報を取得する時には、以前取得した時よりも 200ms 以上の wait
** をおいてからにして下さい. そうしないと、音飛びなどの現象を起こします.
-----------------------------------------------------------------------------*/
if ( c < CDC_WAIT ) { /* wait */
c++ ;
} else {
c = 0 ;
/*-----------------------------------------------------------------------------
** 演奏中ならば演奏時間の情報を表示し、CDが入れ換えられたならば、最初から演奏
** し直します.
-----------------------------------------------------------------------------*/
ret = CDP_status() ;
if ( CDP_NOW_status == CDP_STAT_PLAY ) {
timedisp() ;
}
if ( ret == CDP_ERR_CHANGE ) {
CDP_play() ;
tocdisp() ;
} else if ( CDP_NOW_status == CDP_STAT_STOP ) {
printf( "\n演奏終了しました.\n" ) ;
break ;
}
}
} while ( mbot != MOS_BOTH ) ; /* 左右同時クリックで終了 */
CURON() ;
}
/**************************** シャッフル番号の確認試験 **************************/
void test6()
{
int mbot, mx, my ; /* マウス状態格納変数 */
int dbot, dx, dy ; /* マウス状態格納変数 */
int c ;
int ret ;
printf( "\nSHUFFLE TEST\n" ) ;
printf( "左クリックでシャッフル , 右クリックでやり直し , 左右同時クリックで終了\n" ) ;
/*-----------------------------------------------------------------------------
** シャッフル演奏は、アプリケーション側で制御します.
** CDP_shuffle() を CALL すると、次に演奏する曲番号が返ってきます.
** この曲番号を CDP_NOW_start と CDP_NOW_end にセットして CDP_play() をCALL
** することによって演奏し、CDP_status() を監視し、CDP_NOW_status が CDP_
** NOW_STOP になったならば、次の曲番号を CDP_shuffle() にて取得し、演奏をし
** ます.このような制御をすることによって、シャッフル演奏を実現します.
**
** CDP_shuffle() では、演奏曲がすべて終わった場合には、0 が返ってきます.
** シャッフルしなおす場合には、CDP_shuffleinit を 真 にして CDP_shuffle() を
** CALLします. 一度 CDP_shuffle() をCALLすると、CDP_shuffleinit は 偽 に
** なります.
**
** CDP_shuffle() では、トラックデータが音楽でない場合には、その曲番号は無視され
** て、音楽データの曲番号だけが、返ってきますので、アプリ側でチェックする必要はあり
** ません.
-----------------------------------------------------------------------------*/
CUROFF() ;
c = 0 ;
ret = CDP_status() ;
if ( CDP_NOW_status == CDP_STAT_PLAY ) { /* 演奏中 */
timedisp() ;
}
if ( ret == CDP_ERR_CHANGE ) { /* CDが入れ換えられた */
CDP_play() ;
tocdisp() ;
}
do {
MOS_rdpos( &mbot,&mx,&my ) ;
if ( mbot == MOS_LEFT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
/* マウス左クリック */
/*-----------------------------------------------------------------------------
-----------------------------------------------------------------------------*/
printf( "\n\n" ) ;
for ( ;; ) {
CDP_NOW_start = CDP_shuffle() ;
if ( !CDP_NOW_start ) {
printf( "終わり\n" ) ;
break ;
} else {
printf( "NEXT PLAY ... %d 曲目\n",
CDP_NOW_start ) ;
}
}
mosloop( MOS_LEFT,&dbot,&dx,&dy ) ; /* 左クリック開放を待つ */
}
if ( mbot == MOS_RIGHT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
/* マウス右クリック */
/*-----------------------------------------------------------------------------
-----------------------------------------------------------------------------*/
CDP_FLG_shuffleinit = CDP_TRUE ;
printf( "\n\nシャッフルやり直し ...\n" ) ;
for ( ;; ) {
CDP_NOW_start = CDP_shuffle() ;
if ( !CDP_NOW_start ) {
printf( "終わり\n" ) ;
break ;
} else {
printf( "NEXT PLAY ... %d 曲目\n",
CDP_NOW_start ) ;
}
}
mosloop( MOS_RIGHT,&dbot,&dx,&dy ) ; /* 右クリック開放を待つ */
}
/*-----------------------------------------------------------------------------
** 演奏中にCDの情報を取得する時には、以前取得した時よりも 200ms 以上の wait
** をおいてからにして下さい. そうしないと、音飛びなどの現象を起こします.
-----------------------------------------------------------------------------*/
if ( c < CDC_WAIT ) { /* wait */
c++ ;
} else {
c = 0 ;
/*-----------------------------------------------------------------------------
** 演奏中ならば演奏時間の情報を表示し、CDが入れ換えられたならば、最初から演奏
** し直します.
-----------------------------------------------------------------------------*/
ret = CDP_status() ;
if ( CDP_NOW_status == CDP_STAT_PLAY ) {
timedisp() ;
}
if ( ret == CDP_ERR_CHANGE ) {
CDP_play() ;
tocdisp() ;
}
}
} while ( mbot != MOS_BOTH ) ; /* 左右同時クリックで終了 */
CURON() ;
}
/**************************** シャッフル演奏の確認試験 **************************/
void test7()
{
int mbot, mx, my ; /* マウス状態格納変数 */
int dbot, dx, dy ; /* マウス状態格納変数 */
int c ;
int ret ;
char dispflg = CDP_TRUE ;
printf( "\nSHUFFLE PLAY\n" ) ;
printf( "左クリックで次の曲 , 右クリックでやり直し , 左右同時クリックで終了\n" ) ;
/*-----------------------------------------------------------------------------
** シャッフル演奏は、アプリケーション側で制御します.
** CDP_shuffle() を CALL すると、次に演奏する曲番号が返ってきます.
** この曲番号を CDP_NOW_start と CDP_NOW_end にセットして CDP_play() をCALL
** することによって演奏し、CDP_status() を監視し、CDP_NOW_status が CDP_
** NOW_STOP になったならば、次の曲番号を CDP_shuffle() にて取得し、演奏をし
** ます.このような制御をすることによって、シャッフル演奏を実現します.
**
** CDP_shuffle() では、演奏曲がすべて終わった場合には、0 が返ってきます.
** シャッフルしなおす場合には、CDP_shuffleinit を 真 にして CDP_shuffle() を
** CALLします. 一度 CDP_shuffle() をCALLすると、CDP_shuffleinit は 偽 に
** なります.
**
** CDP_shuffle() では、トラックデータが音楽でない場合には、その曲番号は無視され
** て、音楽データの曲番号だけが、返ってきますので、アプリ側でチェックする必要はあり
** ません.
**
** 注意 : 演奏時間については、トラック内の時間だけが有効となります.
** つまり、CDP_CLOCK_nowtrack と CDP_TIME_nowtrack だけが有効であり
** CDP_CLOCK_nowdisc と CDP_TIME_nowdisc は無効となります.
** トータル 時間が必要であれば、CDP_TIME_music と CDP_TIME_track[] を
** もとに アプリ側で計算して下さい.
** ただし、CDP_status() の代わりに CDP_shuffletime() を CALL した
** 場合(CALL直後)を除きます. この場合でも、演奏中に限ります.
** また、CDP_shuffle() をCALLすることによって 残り時間は変化します.
** そのために、CDP_shuffle() は無闇にCALLしてはいけません.
**
** CDP_shuffle() 及び CDP_shuffletime() 使用時には、CDP_fftime()
** , CDP_rewtime(), CDP_ffmusic(), CDP_rewmusic() を
** 使用してはなりません.
** 使用した場合には、それ以降のシャッフル演奏および時間情報は不定となります.
-----------------------------------------------------------------------------*/
CUROFF() ;
c = 0 ;
/*-----------------------------------------------------------------------------
** シャッフル演奏時は、必ず演奏回数を最小(1)にします.
-----------------------------------------------------------------------------*/
CDP_REP_cnt = CDP_MIN_REPEAT ;
ret = CDP_status() ;
if ( CDP_NOW_status != CDP_STAT_NOTREADY || /* CDがセット状態 */
ret == CDP_ERR_CHANGE ) { /* CDが入れ換えられた */
CDP_NOW_start = CDP_NOW_end = CDP_shuffle() ;
CDP_play() ;
tocdisp() ;
printf( "\nSHUFFLE PLAY ... %d 曲目\n",
CDP_NOW_start ) ;
}
do {
MOS_rdpos( &mbot,&mx,&my ) ;
if ( mbot == MOS_LEFT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
/* マウス左クリック */
/*-----------------------------------------------------------------------------
** CDP_shuffle() を CALL すると、次に演奏する曲番号が返ってきます.
** CDP_shuffle() では、演奏曲がすべて終わった場合には、0 が返ってきます.
-----------------------------------------------------------------------------*/
CDP_NOW_start = CDP_NOW_end = CDP_shuffle() ;
if ( !CDP_NOW_start ) {
CDP_stop() ;
if ( dispflg ) {
printf( "\n\n終わり\n" ) ;
printf( "右クリックでやり直し , 左右同時クリックで終了\n" ) ;
}
dispflg = CDP_FALSE ;
} else {
printf( "\n\nNEXT PLAY ... %d 曲目\n",
CDP_NOW_start ) ;
CDP_play() ;
dispflg = CDP_TRUE ;
}
mosloop( MOS_LEFT,&dbot,&dx,&dy ) ; /* 左クリック開放を待つ */
}
if ( mbot == MOS_RIGHT && CDP_NOW_status != CDP_STAT_NOTREADY ) {
/* マウス右クリック */
/*-----------------------------------------------------------------------------
** シャッフルしなおす場合には、CDP_shuffleinit を 真 にして CDP_shuffle() を
** CALLします. 一度 CDP_shuffle() をCALLすると、CDP_shuffleinit は 偽 に
** なります.
-----------------------------------------------------------------------------*/
CDP_FLG_shuffleinit = CDP_TRUE ;
printf( "\n\nシャッフルやり直し ...\n" ) ;
CDP_NOW_start = CDP_NOW_end = CDP_shuffle() ;
if ( !CDP_NOW_start ) {
CDP_stop() ;
if ( dispflg ) printf( "終わり\n" ) ;
dispflg = CDP_FALSE ;
} else {
printf( "SHUFFLE PLAY ... %d 曲目\n",
CDP_NOW_start ) ;
CDP_play() ;
dispflg = CDP_TRUE ;
}
mosloop( MOS_RIGHT,&dbot,&dx,&dy ) ; /* 右クリック開放を待つ */
}
/*-----------------------------------------------------------------------------
** 演奏中にCDの情報を取得する時には、以前取得した時よりも 200ms 以上の wait
** をおいてからにして下さい. そうしないと、音飛びなどの現象を起こします.
-----------------------------------------------------------------------------*/
if ( c < CDC_WAIT ) { /* wait */
c++ ;
} else {
c = 0 ;
/*-----------------------------------------------------------------------------
** 演奏中ならば演奏時間の情報を表示し、CDが入れ換えられたならば、シャッフル演奏
** し直します.
**
** 注意 : 演奏時間については、トラック内の時間だけが有効となります.
** つまり、CDP_CLOCK_nowtrack と CDP_TIME_nowtrack だけが有効であり
** CDP_CLOCK_nowdisc と CDP_TIME_nowdisc は無効となります.
** トータル 時間が必要であれば、CDP_TIME_music と CDP_TIME_track[] を
** もとに アプリ側で計算して下さい.
** ただし、CDP_status() の代わりに CDP_shuffletime() を CALL した
** 場合(CALL直後)を除きます. この場合でも、演奏中に限ります.
** また、CDP_shuffle() をCALLすることによって 残り時間は変化します.
** そのために、CDP_shuffle() は無闇にCALLしてはいけません.
**
** CDP_shuffle() 及び CDP_shuffletime() 使用時には、CDP_fftime(),
** CDP_rewtime(), CDP_ffmusic(), CDP_rewmusic() を使用してはなりません.
** 使用した場合には、それ以降のシャッフル演奏および時間情報は不定となります.
-----------------------------------------------------------------------------*/
ret = CDP_shuffletime() ;
if ( CDP_NOW_status == CDP_STAT_PLAY ) { /* 演奏中 */
timedisp() ;
} else if ( CDP_NOW_status == CDP_STAT_STOP ) { /* 停止中 */
CDP_NOW_start = CDP_NOW_end = CDP_shuffle() ;
if ( !CDP_NOW_start ) {
if ( dispflg ) {
printf( "\n\n終わり\n" ) ;
printf( "右クリックでやり直し , 左右同時クリックで終了\n" ) ;
}
dispflg = CDP_FALSE ;
} else {
printf( "\n\nNEXT PLAY ... %d 曲目\n",
CDP_NOW_start ) ;
CDP_play() ;
dispflg = CDP_TRUE ;
}
}
if ( ret == CDP_ERR_CHANGE ) {
CDP_NOW_start = CDP_NOW_end = CDP_shuffle() ;
CDP_play() ;
tocdisp() ;
printf( "\nSHUFFLE PLAY ... %d 曲目\n",
CDP_NOW_start ) ;
dispflg = CDP_TRUE ;
}
}
} while ( mbot != MOS_BOTH ) ; /* 左右同時クリックで終了 */
CURON() ;
}
/***************************** CD演奏ライブラリ試験 ****************************/
void main( int ac,char *av[] )
{
int c ;
int ret ;
MOS_start( Mwork,MworkSize ) ;
MOS_disp( CDP_FALSE ) ; /* マウス非表示 */
/*-----------------------------------------------------------------------------
** 電子ボリュームの設定は、あらかじめアプリケーション側で行う必要があります!
-----------------------------------------------------------------------------*/
SND_elevol_init() ; /* 電子ボリューム初期化 */
SND_elevol_set( 1,127,127 ) ; /* CDのボリュームをMAX(L/R)に */
printf( "試験したい機能番号を入力して下さい.\n" ) ;
printf( " 1 : NEXT / BEFORE PLAY\n" ) ;
printf( " 2 : PAUSE ON/OFF\n" ) ;
printf( " 3 : FF / REW PLAY\n" ) ;
printf( " 4 : PAUSE 中の FF / REW PLAY\n" ) ;
printf( " 5 : PAUSE 中の NEXT / BEFORE PLAY\n" ) ;
printf( " 6 : SHUFFLE TEST\n" ) ;
printf( " 7 : SHUFFLE PLAY\n" ) ;
printf( "\n" ) ;
for ( ;; ) {
printf( ">" ) ;
scanf( "%d",&c ) ;
if ( c >= 0 && c < 8 ) break ;
}
printf( "\n" ) ;
/*-----------------------------------------------------------------------------
** 初期状態が演奏中かどうかをチェックする必要がなければ、あらかじめ CDP_status()
** をCALLする必要はありません.
-----------------------------------------------------------------------------*/
printf( "初期状態 ... " ) ;
ret = CDP_status() ;
switch ( CDP_NOW_status ) {
case CDP_STAT_NOTREADY :
printf( "CDがセットされていません.\n" ) ;
break ;
case CDP_STAT_STOP :
printf( "CDが入っています.\n" ) ;
break ;
case CDP_STAT_PLAY :
printf( "演奏中です.\n" ) ;
break ;
case CDP_STAT_PAUSE :
printf( "一時停止中です.\n" ) ;
break ;
default :
printf( "わかんない ???\n" ) ;
}
CDP_debug_dispmsg( ret ) ;
/*-----------------------------------------------------------------------------
** 演奏を開始する前に、TOC 情報を必要としなければ、あらかじめ CDP_tocread()
** をCALLする必要はありません.
-----------------------------------------------------------------------------*/
printf( "\nTOC情報読み込み ...\n" ) ;
ret = CDP_tocread() ;
if ( ret ) {
printf( "TOC読み込み失敗\n" ) ;
} else {
printf( "TOC読み込み成功!\n" ) ;
tocdisp() ;
}
/*-----------------------------------------------------------------------------
** 演奏を開始する時に、演奏開始曲/終了曲等の各パラメタを設定する必要がある場合に
** は、必ず前もって CDP_status() か CDP_tocread() をCALLしておく必要があり
** ます.
** ただし、最初だけであり、一度でも CDP_*****() をCALLしていれば、必要ありま
** せん.
**
** 演奏開始曲番号は、CDP_NOW_start にセットします.(省略値は、最初の曲)
** 演奏終了曲番号は、CDP_NOW_end にセットします.(省略値は、最後の曲)
** 繰り返し演奏回数は、CDP_REP_cnt にセットします.(省略値は、1回)
** ただし、これらのパラメタに誤りがあると、CDP_****() は、パラメタエラーを返します.
-----------------------------------------------------------------------------*/
printf( "\nPLAY ... %d 曲目 ~ %d 曲目\n",
CDP_NOW_start,CDP_NOW_end ) ;
CDP_debug_dispmsg( CDP_play() ) ;
/*-----------------------------------------------------------------------------
** デバッグ用に CDP_status() をCALLしていますが、CDP_play() をCALLした直後
** であれば、CDP_status() をCALLしなくても、情報はグローバル変数にセットされてい
** ます.
-----------------------------------------------------------------------------*/
printf( "実際の演奏曲は、%d 曲目 ~ %d 曲目\n演奏後の状態 ... ",
CDP_NOW_start,CDP_NOW_end ) ;
CDP_debug_dispmsg( CDP_status() ) ;
switch ( c ) {
case 1 :
test1() ;
break ;
case 2 :
test2() ;
break ;
case 3 :
test3() ;
break ;
case 4 :
test4() ;
break ;
case 5 :
test5() ;
break ;
case 6 :
test6() ;
break ;
case 7 :
test7() ;
break ;
}
if ( ac > 1 ) CDP_stop() ; /* 引数ありならばSTOP */
MOS_end() ; /* マウス終了 */
}